#include "../mqserver/mq_message.hpp"
#include <gtest/gtest.h>


castlemq::MessageManager::ptr mmp;
class MessageTest:public testing::Environment
{
    public:
        virtual void SetUp() override
        {
            mmp=std::make_shared<castlemq::MessageManager>("./data/message");
            mmp->initQueueMessage("queue1");
        }

        // virtual void TearDown() override
        // {
        //     mmp->clear();
        // }
};

//新增消息测试
TEST(MessageTest,insert_test)
{
    castlemq::BasicProperties properities;
    properities.set_id(castlemq::UuidHelper::Mkuuid());
    properities.set_delivery_mode(castlemq::DeliveryMode::DURABLE);
    properities.set_routing_key("news.music.pop");
    mmp->insert("queue1",&properities,"hello world-1",castlemq::DeliveryMode::DURABLE);
    mmp->insert("queue1",nullptr,"hello world-2",castlemq::DeliveryMode::DURABLE);
    mmp->insert("queue1",nullptr,"hello world-3",castlemq::DeliveryMode::DURABLE);
    mmp->insert("queue1",nullptr,"hello world-4",castlemq::DeliveryMode::DURABLE);
    mmp->insert("queue1",nullptr,"hello world-5",castlemq::DeliveryMode::UNDURABLE);
    ASSERT_EQ(mmp->total_count("queue1"),4);
    ASSERT_EQ(mmp->durable_count("queue1"),4);
    ASSERT_EQ(mmp->getable_count("queue1"),5);
    ASSERT_EQ(mmp->waitack_count("queue1"),0);
    
}

//获取消息测试
// TEST(MessageTest,get_test)
// {
//     castlemq::MessagePtr mp1=mmp->front("queue1");
//     ASSERT_EQ(mp1->payload().body(),std::string("hello world-1"));
//     ASSERT_EQ(mmp->getable_count("queue1"),4);
//     ASSERT_EQ(mmp->waitack_count("queue1"),1);

//     castlemq::MessagePtr mp2=mmp->front("queue1");
//     ASSERT_EQ(mp2->payload().body(),std::string("hello world-2"));
//     ASSERT_EQ(mmp->getable_count("queue1"),3);
//     ASSERT_EQ(mmp->waitack_count("queue1"),2);

//     castlemq::MessagePtr mp3=mmp->front("queue1");
//     ASSERT_EQ(mp3->payload().body(),std::string("hello world-3"));
//     ASSERT_EQ(mmp->getable_count("queue1"),2);
//     ASSERT_EQ(mmp->waitack_count("queue1"),3);

//     castlemq::MessagePtr mp4=mmp->front("queue1");
//     ASSERT_EQ(mp4->payload().body(),std::string("hello world-4"));
//     ASSERT_EQ(mmp->getable_count("queue1"),1);
//     ASSERT_EQ(mmp->waitack_count("queue1"),4);

//     castlemq::MessagePtr mp5=mmp->front("queue1");
//     ASSERT_EQ(mp5->payload().body(),std::string("hello world-5"));
//     ASSERT_EQ(mmp->getable_count("queue1"),0);
//     ASSERT_EQ(mmp->waitack_count("queue1"),5);
// }

// class MessageTest1:public testing::Test
// {
//     public:
//         static void SetUpTestSuite() {
//             //这两个接口只有在这个单元测试所有test_f执行前执行一遍
//             mmp1->initQueueMessage("queue1");
//             std::cout << "MessageTest1 SetUp" << std::endl;
//             //所以只能进行一次的初始化放在这个接口中更合适 ---
//             //其他的用法到底哪些初始化和清理接口应该放在那里，根据具体情况而定
//             //这个接口也有个缺陷，就是这个接口是个静态函数，因此无法访问类的非静态成员。所以这里 的mmp1需要呗定义为静态成员才行
//         }
//         static void TearDownTestSuite() {
//             mmp1->clear();
//         }
//         virtual void SetUp() override
//         {
//             //这个接口会在当前类的每个test_f执行钱执行一遍

//         }

//         virtual void TearDown() override
//         {
//         }
//     public:
//         static::castlemq::MessageManager::ptr mmp1;
// };
// //
// castlemq::MessageManager::ptr MessageTest1::mmp1=std::make_shared<castlemq::MessageManager>("./data/message");
// //恢复历史数据测试
// TEST_F(MessageTest1,recovery_test)
// {
//     //局部单元测试中，这个接口第一个名称必须与单元测试类名一致，这样才能在test_f中直接访问类的成员变量，否则无法访问
//     // mmp1->initQueueMessage("queue1");//这个
//     ASSERT_TRUE(mmp1.get() != nullptr);
//     castlemq::MessagePtr mp1=mmp1->front("queue1");
//     ASSERT_TRUE(mp1.get() != nullptr);//最主要的就是这里没有判空，有可能mp1是空，所以后续操作就会导致崩溃
//     ASSERT_EQ(mp1->payload().body(),std::string("hello world-1"));
//     ASSERT_EQ(mmp1->getable_count("queue1"),3);
//     ASSERT_EQ(mmp1->waitack_count("queue1"),1);

//     castlemq::MessagePtr mp2=mmp1->front("queue1");
//     ASSERT_EQ(mp2->payload().body(),std::string("hello world-2"));
//     ASSERT_EQ(mmp1->getable_count("queue1"),2);
//     ASSERT_EQ(mmp1->waitack_count("queue1"),2);

//     castlemq::MessagePtr mp3=mmp1->front("queue1");
//     ASSERT_EQ(mp3->payload().body(),std::string("hello world-3"));
//     ASSERT_EQ(mmp1->getable_count("queue1"),1);
//     ASSERT_EQ(mmp1->waitack_count("queue1"),3);

//     castlemq::MessagePtr mp4=mmp1->front("queue1");
//     ASSERT_EQ(mp4->payload().body(),std::string("hello world-4"));
//     ASSERT_EQ(mmp1->getable_count("queue1"),0);
//     ASSERT_EQ(mmp1->waitack_count("queue1"),4);
// }

//删除消息测试
TEST(MessageTest,remove_test)
{
    castlemq::MessagePtr mp1=mmp->front("queue1");
    ASSERT_EQ(mp1->payload().body(),std::string("hello world-1"));
    ASSERT_EQ(mmp->getable_count("queue1"),4);
    ASSERT_EQ(mmp->waitack_count("queue1"),1);
    mmp->ack("queue1",mp1->payload().properties().id());
    ASSERT_EQ(mmp->waitack_count("queue1"),0);
    ASSERT_EQ(mmp->durable_count("queue1"),3);
    ASSERT_EQ(mmp->total_count("queue1"),4);
}

//销毁测试
TEST(MessageTest,destroy_test)
{
    mmp->destroyQueueMessage("queue1");
}
int main(int argc,char* argv[])
{
    testing::InitGoogleTest(&argc,argv);
    testing::AddGlobalTestEnvironment(new MessageTest);
    // testing::AddGlobalTestEnvironment(new MessageTest1);
    return RUN_ALL_TESTS();
}
